﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
using System.Text;
using System.IO;
using System.Data;
using System.Text.RegularExpressions;
using System.Collections;
/// <summary>
///SetConnLink 的摘要说明
/// </summary>
public static class SetConnLink
{

    /// <summary>
    /// 去掉文章中的链接
    /// </summary>
    /// <param name="_Html"></param>
    /// <returns></returns>
    public static string GetNoneLink(string _Html)
    {
        _Html = Regex.Replace(_Html, "<a[^>]*href=[\'\"\\s]*([^\\s\'\"]*)[^>]*>(.+?)<\\/a>", "$2");
        return _Html;
    }
    /// <summary>
    /// 给关键字加链接，同一关键字只加一次 慢的要命。。
    /// </summary>
    /// <param name="src">源字符串</param>
    /// <param name="keys">关键字泛型</param>
    /// <returns>替换后结果</returns>
    public static string FormatBody(string src)
    {
        List<string> keys = SetLink();//获取关键字数组
        Hashtable KeyUrl = GetLinkHS();

        Regex reg = new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");
        int length = 0;
        string temp = string.Empty;
        return reg.Replace(src, delegate(Match m)
        {
            temp = m.Value;
            length = temp.Length;
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*)(?<tag>" + Regex.Escape(keys[i]) + @")", @"$1<a href='" + KeyUrl[keys[i]].ToString() + "'>${tag}</a>");
                if (length != temp.Length)
                {
                    keys.Remove(keys[i]);
                }
                length = temp.Length;
            }
            return temp;
        });
    }
    ///// <summary>
    ///// 获取关键字
    ///// </summary>
    ///// <returns></returns>
    public static Hashtable GetLinkHS()
    {
        OleDbConnection myconn = new OleDbConnection(DB.conn);
        OleDbDataAdapter drr = new OleDbDataAdapter("Select * from [KeyWord]", myconn);
        DataSet ds = new DataSet();
        try
        {
            drr.Fill(ds);

        }
        catch (OleDbException ex)
        {
            throw new Exception(ex.Message, ex);
        }
        Hashtable tags = new Hashtable();
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            string s = dr["keyword"].ToString();
            tags.Add(dr["keyword"].ToString(), dr["geturl"].ToString());
        }
        return tags;
    }
    public static List<string> SetLink()
    {
        OleDbConnection myconn = new OleDbConnection(DB.conn);
        OleDbDataAdapter drr = new OleDbDataAdapter("Select * from [KeyWord]", myconn);
        DataSet ds = new DataSet();
        try
        {
            drr.Fill(ds);
        }
        catch (OleDbException ex)
        {
            throw new Exception(ex.Message, ex);
        }
        List<string> tags = new List<string>();
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            tags.Add(dr.ItemArray[1].ToString());
        }
        return tags;
    }
    ///// <summary>
    ///// 简单方法关联关键字链接 会出问题
    ///// </summary>
    ///// <param name="conn"></param>
    ///// <returns></returns>
    //public static string SetLink(string conn)
    //{
    //    OleDbConnection myconn = new OleDbConnection(DB.conn);
    //    OleDbDataAdapter drr = new OleDbDataAdapter("Select * from [KeyWord]", myconn);
    //    DataSet ds = new DataSet();
    //    try
    //    {
    //        drr.Fill(ds);

    //    }
    //    catch (OleDbException ex)
    //    {
    //        throw new Exception(ex.Message, ex);
    //    }
    //    string conten = conn;
    //    foreach (DataRow dr in ds.Tables[0].Rows)
    //    {
    //        if (conten.IndexOf(dr.ItemArray[1].ToString()) > -1)
    //        {
    //            conten = conten.Substring(0, conten.IndexOf(dr.ItemArray[1].ToString()) + dr.ItemArray[1].ToString().Length).Replace(dr.ItemArray[1].ToString(), "<a href='" + dr.ItemArray[2].ToString() + "' target='_blank'>" + dr.ItemArray[1].ToString() + "</a>") + conten.Substring(conten.IndexOf(dr.ItemArray[1].ToString()) + dr.ItemArray[1].ToString().Length);

    //        }
    //        List<string> tags = new List<string>();
    //        tags.Add(dr.ItemArray[1].ToString());


    //    }
    //    return conten;
    //}
    ///// <summary>
    ///// 根据关键字返回链接
    ///// </summary>
    ///// <param name="key"></param>
    ///// <returns></returns>
    //public static string SetLinkUrl(string key)
    //{
    //    int kc = GetUrl_KeySCountForKey(key);
    //    if (kc > 1)
    //    {
    //        OleDbConnection myconn = new OleDbConnection(DB.conn);
    //        OleDbDataReader oda = GetUrl_KeyForKey(key);
    //        int a = 0;
    //        string[] UrlList = new string[kc];
    //        while (oda.Read())
    //        {
    //            UrlList[a] = oda["geturl"].ToString();
    //            a++;
    //        }
    //        oda.Close();
    //        oda.Dispose();
    //        Random r = new Random();
    //        int ai = r.Next(a);
    //        return UrlList[ai].ToString();
    //    }
    //    else
    //    {
    //        string str = "";
    //        OleDbConnection myconn = new OleDbConnection(DB.conn);
    //        OleDbDataReader oda = GetUrl_KeyForKey(key);
    //        if (oda.Read())
    //        {
    //            str = oda["geturl"].ToString();

    //        }
    //        else
    //        {
    //            str = "";
    //        }
    //        oda.Close();
    //        oda.Dispose();
    //        return str;

    //    }
    //}
    //public static OleDbDataReader GetUrl_KeyForKey(string Ky)
    //{
    //    OleDbConnection myconn = new OleDbConnection(DB.conn);
    //    OleDbCommand com = new OleDbCommand("Select * from [KeyWord] where [keyword]='" + Ky + "'", myconn);
    //    OleDbDataReader DR = null;
    //    try
    //    {
    //        myconn.Open();
    //        DR = com.ExecuteReader(CommandBehavior.CloseConnection);
    //    }
    //    catch (OleDbException ex)
    //    {
    //        throw new Exception(ex.Message, ex);
    //    }
    //    return DR;
    //}
    //public static int GetUrl_KeySCountForKey(string keyw)
    //{
    //    OleDbConnection myconn = new OleDbConnection(DB.conn);
    //    OleDbCommand com = new OleDbCommand("Select Count(*) from [KeyWord] where [keyword]='" + keyw + "' ", myconn);
    //    int DR = 0;
    //    try
    //    {
    //        myconn.Open();
    //        DR = int.Parse(com.ExecuteScalar().ToString());
    //    }
    //    catch (OleDbException ex)
    //    {
    //        throw new Exception(ex.Message, ex);
    //    }
    //    finally
    //    {
    //        myconn.Close();
    //    }
    //    return DR;
    //}


    /// <summary>
    /// 关联关键字链接 较费时间
    /// </summary>
    /// <param name="body"></param>
    /// <returns></returns>
    //public static string FormatBody(string body)
    //{
    //    Hashtable key = SetLink();
    //    Regex reg = new Regex(@"(<a .+?</a>)|(<pre(>|\s).+?</pre>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    //    Match mat = reg.Match(body);
    //    List<string> str1 = new List<string>();
    //    List<string> str2 = new List<string>();
    //    int indx = 0;
    //    while (mat.Success)
    //    {
    //        str1.Add(body.Substring(indx, mat.Index - indx));
    //        str2.Add(mat.Value);
    //        indx = mat.Index + mat.Length;

    //        mat = reg.Match(body, indx);
    //    }
    //    str1.Add(body.Substring(indx));
    //    str2.Add("");

    //    StringBuilder sb = new StringBuilder();
    //    int p = 50, cnt, len;
    //    StringBuilder tmp;
    //    Regex reg2;
    //    Match mat2;

    //    for (int i = 0; i < str1.Count; i++)
    //    {
    //        tmp = new StringBuilder(str1[i]);

    //        if (Regex.Replace(tmp.ToString(), @"<.+?>", "").Length > 5)
    //        {
    //            cnt = tmp.Length / p;
    //            len = 0;
    //            foreach (System.Collections.DictionaryEntry _tag in key)//遍历关键字
    //            {
    //                //str = Regex.Replace(str, @"([^<]+?)(" + _tag + ")", "$1<a href='/tag/$2.htm'>$2</a>", RegexOptions.IgnoreCase);
    //                reg2 = new Regex(@"((^|>)[^<]+?)(" + _tag.Key.ToString() + ")", RegexOptions.IgnoreCase);
    //                mat2 = reg2.Match(tmp.ToString());
    //                if (mat2.Success)
    //                {
    //                    tmp.Remove(mat2.Index, mat2.Length);
    //                    tmp.Insert(mat2.Index, mat2.Groups[1].Value + "<a href='" + _tag.Value.ToString() + "'>" + _tag.Key.ToString() + "</a>");
    //                    //if (++len > cnt) break;
    //                }
    //            }
    //        }
    //        sb.Append(tmp.ToString());
    //        sb.Append(str2[i]);
    //    }
    //    return sb.ToString();
    //}
    ///// <summary>
    ///// 给关键字加链接
    ///// </summary>
    ///// <param name="body"></param>
    ///// <returns></returns>
    //public static string FormatBody2(string body)
    //{
    //    List<string> key = SetLink();
    //    Regex reg = new Regex(@"(<a .+?</a>)|(<pre(>|\s).+?</pre>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    //    Match mat = reg.Match(body);
    //    List<string> str1 = new List<string>();
    //    List<string> str2 = new List<string>();
    //    int indx = 0;
    //    while (mat.Success)
    //    {
    //        str1.Add(body.Substring(indx, mat.Index - indx));
    //        str2.Add(mat.Value);
    //        indx = mat.Index + mat.Length;

    //        mat = reg.Match(body, indx);
    //    }
    //    str1.Add(body.Substring(indx));
    //    str2.Add("");

    //    StringBuilder sb = new StringBuilder();
    //    int p = 50, cnt, len;
    //    StringBuilder tmp;
    //    Regex reg2;
    //    Match mat2;

    //    for (int i = 0; i < str1.Count; i++)
    //    {
    //        tmp = new StringBuilder(str1[i]);

    //        if (Regex.Replace(tmp.ToString(), @"<.+?>", "").Length > 5)
    //        {
    //            cnt = tmp.Length / p;
    //            len = 0;
    //            foreach (string _tag in key)//AllTags包含了站内所有关键字
    //            {
    //                //str = Regex.Replace(str, @"([^<]+?)(" + _tag + ")", "$1<a href='/tag/$2.htm'>$2</a>", RegexOptions.IgnoreCase);
    //                reg2 = new Regex(@"((^|>)[^<]+?)(" + _tag + ")", RegexOptions.IgnoreCase);
    //                mat2 = reg2.Match(tmp.ToString());
    //                if (mat2.Success)
    //                {
    //                    tmp.Remove(mat2.Index, mat2.Length);
    //                    tmp.Insert(mat2.Index, mat2.Groups[1].Value + "<a href='" + SetLinkUrl(_tag) + "'>" + _tag + "</a>");
    //                    //if (++len > cnt) break;
    //                }
    //            }
    //        }
    //        sb.Append(tmp.ToString());
    //        sb.Append(str2[i]);
    //    }
    //    return sb.ToString();
    //}


}